#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QtDBus/QDBusConnection>
#include <MediaController>
#include <vkaudioadaptor.h>

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    //QDBusConnection connection = QDBusConnection::sessionBus();
    //new MainWindow(this);
    qDebug() << "new Main window";
    //UnityMusicPlayer player;
    ui->setupUi(this);
    isplay = 0;
    model = new QStandardItemModel(this);
    xml_document = new QDomDocument();
    ui->tv_myaudio->setModel(model);
    ui->tv_myaudio->hideColumn(2);  //В TableView скрываем 2(по индексу) колонку, в котором содержется url
    model->setHeaderData(0,Qt::Horizontal,tr("ARTIST"),Qt::DisplayRole); //Изменяем заголовок у 0 столбца
    model->setHeaderData(1,Qt::Horizontal,tr("TITLE"),Qt::DisplayRole); //Изменяем заголовок у 1 столбца


    //Player
    audioOutput = new Phonon::AudioOutput(Phonon::MusicCategory, this);
    Phonon::createPath(&play_track, audioOutput);
    connect(&media, SIGNAL(metaDataChanged()), this, SLOT(onMetadataChanged()));
    seekSlider = new Phonon::SeekSlider(this);
    seekSlider->setMediaObject(&play_track);
    volumeSlider = new Phonon::VolumeSlider(this);
    volumeSlider->setAudioOutput(audioOutput);
    volumeSlider->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Maximum);
    ui->gridLayout->addWidget(seekSlider);
    //ui->gridLayout->addWidget(volumeSlider);
    ui->horizontalLayout_2->addWidget(volumeSlider);
    connect(&play_track,SIGNAL(aboutToFinish()),this,SLOT(next_track()));
    this->load_list();

}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::on_bt_update_list_clicked()
{
    authdialog auth;
    auth.exec();
    this->load_list();
}

void MainWindow::load_list()
{
    QFile file ("audio.xml");
    if (file.open(QIODevice::ReadOnly))
    {
        if (xml_document->setContent(&file)); //Устанавливаем исходный текст с XML
        {
            model->setRowCount(0);
            model->setColumnCount(3);
            ui->tv_myaudio->hideColumn(2); //Скрываем 2 колонку, нужно вызывать метод, при каждой очистке модели

            QDomElement xmlElement = xml_document->documentElement(); //Выбираем первый элемент в xml документе, им является: <response list="true">
            if (xmlElement.attribute("list","") == "true") //Проверяем его атрибут: list
            {
                traverseNode(xmlElement); //Вызываем рекурсивную функцию обработки xml документа. Xml документ представляет собой иерархическую структуру
            }
        }
        model->setHeaderData(0,Qt::Horizontal,tr("ARTIST"),Qt::DisplayRole); //Изменяем заголовок у 0 столбца
        model->setHeaderData(1,Qt::Horizontal,tr("TITLE"),Qt::DisplayRole); //Изменяем заголовок у 1 столбца
        ui->tv_myaudio->resizeColumnsToContents();
    }
    else
    {
        authdialog auth;
        auth.exec();
        this->load_list();
    }
}

void MainWindow::traverseNode(const QDomNode &node)
{
    QDomNode xmlNode = node.firstChild(); //Выбираем первый дочерний элемент, в 1 вызове им является элемент <audio>, при втором вызове им будет <aid>, но его пропускаем и переходим на следующую итерацию цикла
    while(!xmlNode.isNull())
    {
        if (xmlNode.isElement())
        {
            QDomElement xmlElement = xmlNode.toElement();
            if (!xmlElement.isNull())
            {
                if(xmlElement.tagName() == "audio") //Если текущий элементом (блоком) является audio, следовательно добавляем строчку в модель
                {
                    model->insertRow(model->rowCount()); //Добавляем строчку в конец таблицы в модели
                }
                if(xmlElement.tagName() == "artist") //Если текущим элемментом является, элемент который содержит имя артиста, то ставляем его в модель(в 1 столбец, в посленюю строчку)
                {
                    QModelIndex index = model->index(model->rowCount()-1,0,QModelIndex());
                    model->setData(index,xmlElement.text());
                }
                if(xmlElement.tagName() == "title") //Если текущим элемментом является, элемент который содержит имя артиста, то ставляем его в модель(в 1 столбец, в посленюю строчку)
                {
                    QModelIndex index = model->index(model->rowCount()-1,1,QModelIndex());
                    model->setData(index,xmlElement.text());
                }
                if(xmlElement.tagName() == "url") //Если текущим элемментом является, элемент который содержит имя артиста, то ставляем его в модель(в 1 столбец, в посленюю строчку)
                {
                    QModelIndex index = model->index(model->rowCount()-1,2,QModelIndex());
                    model->setData(index,xmlElement.text());
                }
            }
        }
        traverseNode(xmlNode);
        xmlNode = xmlNode.nextSibling();
    }
}

void MainWindow::onMetadataChanged()
{
  /*  int rowcount;
    rowcount = ui->tableWidget->rowCount();
        MetaData = media.metaData(Phonon::ArtistMetaData);
        MetaData << media.metaData(Phonon::AlbumMetaData);
        MetaData << media.metaData(Phonon::TitleMetaData);
        MetaData << media.metaData(Phonon::DateMetaData);
        QTableWidgetItem *artistmp3 = new QTableWidgetItem(QVariant(MetaData.value(0,"")).toString());
        QTableWidgetItem *track = new QTableWidgetItem(QVariant(MetaData.value(1,"")).toString());
        ui->tableWidget->setItem(track_count,0,artistmp3);
        ui->tableWidget->setItem(track_count,1,track);
        track_count++;
        if (track_count<=rowcount-1)
        {
            media.setCurrentSource(Phonon::MediaSource(ui->tableWidget->item(track_count,3)->text()));
        }*/
}

void MainWindow::next_track()
{
    int row_count = model->rowCount();
    QString url_music;
    QModelIndex index;
    if (row_count-1 == track_current)
    {
        track_current = 0;
        index = model->index(track_current,2,QModelIndex());
        url_music = model->data(index,Qt::DisplayRole).toString();
    }
    else
    {
        track_current++;
        index = model->index(track_current,2,QModelIndex());
        url_music = model->data(index,Qt::DisplayRole).toString();
    }
    play_track.setCurrentSource(Phonon::MediaSource(url_music));
    play_track.play();
    ui->tv_myaudio->selectRow(track_current);
    this->indicate();
}

void MainWindow::previous_track()
{
    int row_count = model->rowCount();
    QString url_music;
    QModelIndex index;
    if (track_current == 0)
    {
        track_current = row_count-1;
        index = model->index(track_current,2,QModelIndex());
        url_music = model->data(index,Qt::DisplayRole).toString();
    }
    else
    {
        track_current = track_current-1;
        index = model->index(track_current,2,QModelIndex());
        url_music = model->data(index,Qt::DisplayRole).toString();
    }
    play_track.setCurrentSource(Phonon::MediaSource(url_music));
    play_track.play();
    this->indicate();
    ui->tv_myaudio->selectRow(track_current);
}

void MainWindow::on_bt_play_clicked()
{
    if (track_current != ui->tv_myaudio->currentIndex().row())
    {
        track_current = ui->tv_myaudio->currentIndex().row();
        QModelIndex index = model->index(track_current,2,QModelIndex());
        QString url_music = model->data(index,Qt::DisplayRole).toString();
        play_track.setCurrentSource(Phonon::MediaSource(url_music));
        isplay = 0;
        this->indicate();
    }
    if (isplay == 0)
    {
        play_track.play();
        isplay = 1;
        ui->bt_play->setText("Pause");
    }
    else
    {
        play_track.pause();
        isplay = 0;
        ui->bt_play->setText("Play");
    }
}

void MainWindow::indicate()
{
    #if defined(Q_OS_LINUX)
        QModelIndex index;
        QString notify = "notify-send";
        index = model->index(track_current,0,QModelIndex());
        QString artist = model->data(index,Qt::DisplayRole).toString();
        index = model->index(track_current,1,QModelIndex());
        QString title = model->data(index,Qt::DisplayRole).toString();
        QStringList notify_arguments;
        notify_arguments << artist << title;
        QProcess* notify_proc = new QProcess(this);
        notify_proc->start(notify, notify_arguments);
    #endif
}

void MainWindow::on_bt_previous_clicked()
{
    this->previous_track();
    isplay = 1;
    ui->bt_play->setText("Pause");
}

void MainWindow::on_bt_next_clicked()
{
    this->next_track();
    isplay = 1;
    ui->bt_play->setText("Pause");
}

void MainWindow::on_bt_stop_clicked()
{
    play_track.stop();
    isplay = 0;
    ui->bt_play->setText("Play");
}

void MainWindow::track_play(const Phonon::MediaSource&)
{
    if (isplay == 0)
    {
        play_track.play();
        isplay = 1;
    }
    else
    {
        play_track.pause();
        isplay = 0;
    }
}

void MainWindow::keyPressEvent(QKeyEvent *event)
{
    if (event->key() == Qt::Key_MediaNext)
    {
        this->next_track();
        event->accept();
    }
    if (event->key() == Qt::Key_MediaPrevious)
    {
        this->previous_track();
        event->accept();
    }
    if (event->key() == Qt::Key_MediaStop)
    {
        this->on_bt_stop_clicked();
        event->accept();
    }
    if (event->key() == (Qt::Key_MediaPlay || Qt::Key_MediaPause))
    {
        this->on_bt_play_clicked();
        event->accept();
    }
}

void MainWindow::Next()
{
    this->next_track();
}

void MainWindow::on_tv_myaudio_doubleClicked(const QModelIndex &index)
{
    this->on_bt_play_clicked();
}

void MainWindow::MediaPlayerKeyPressed(const QString &in0, const QString &in1)
{
    qDebug("SIGNAL:");
    qDebug(in0.toLocal8Bit().data());
    qDebug(in1.toLocal8Bit().data());
    if (in1 == "Play") this->on_bt_play_clicked();
    if (in1 == "Next") this->on_bt_next_clicked();
    if (in1 == "Previous") this->on_bt_previous_clicked();
    if (in1 == "Stop") this->on_bt_stop_clicked();
}
